package utils;

import ui.ColorTableCellRenderer;

import javax.swing.table.TableModel;
import java.awt.Color;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

public class HtmlReportUtil {

    /**
     * 生成HTML报告
     * @param file 要保存的文件
     * @param tableModel 表格模型
     * @param lowPrivilegeRenderers 低权限结果列渲染器
     * @param unauthorizedRenderers 未授权结果列渲染器
     * @param filter 过滤条件 ("全部", "被绕过", "待确认", "可防御")
     * @param removeDuplicates 是否去重
     * @throws IOException 文件写入异常
     */
    public static void generateHtmlReport(
            File file,
            TableModel tableModel,
            List<ColorTableCellRenderer> lowPrivilegeRenderers,
            List<ColorTableCellRenderer> unauthorizedRenderers,
            String filter,
            boolean removeDuplicates) throws IOException {

        try (FileWriter fileWriter = new FileWriter(file)) {
            StringBuilder htmlContent = new StringBuilder();
            htmlContent.append("<!DOCTYPE html>\n");
            htmlContent.append("<html>\n<head>\n");
            htmlContent.append("<meta charset=\"UTF-8\">\n");
            htmlContent.append("<title>PermissionTest Report</title>\n");
            htmlContent.append("<style>\n");
            htmlContent.append("h1 { color: #333; }\n");
            htmlContent.append("table { border-collapse: collapse; width: 100%; margin-top: 20px; }\n");
            htmlContent.append("th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }\n");
            htmlContent.append("th { background-color: #f2f2f2; }\n");
            htmlContent.append(".defended { background-color: #00FF00; }\n");       // 绿色 - 可防御
            htmlContent.append(".bypassed { background-color: #FF0000; }\n");       // 红色 - 被绕过
            htmlContent.append(".potentially-bypassed { background-color: #FFFF00; }\n"); // 黄色 - 待确认
            htmlContent.append("</style>\n");
            htmlContent.append("</head>\n<body>\n");
            
            htmlContent.append("<h1>PermissionTest Report</h1>\n");

            if (tableModel != null && tableModel.getRowCount() > 0) {
                htmlContent.append("<table>\n");

                // 写入表头
                htmlContent.append("<thead>\n<tr>\n");
                for (int i = 0; i < tableModel.getColumnCount(); i++) {
                    htmlContent.append("<th>").append(tableModel.getColumnName(i)).append("</th>\n");
                }
                htmlContent.append("</tr>\n</thead>\n");

                // 写入表格内容
                htmlContent.append("<tbody>\n");
                
                // 用于跟踪已处理的URL（去重用）
                java.util.Set<String> processedUrls = new java.util.HashSet<>();
                
                for (int row = 0; row < tableModel.getRowCount(); row++) {
                    // 根据过滤条件筛选行
                    if (!shouldIncludeRow(tableModel, row, filter)) {
                        continue;
                    }
                    
                    // 获取URL用于去重判断
                    String url = (String) tableModel.getValueAt(row, 2); // URL列
                    
                    // 如果需要去重且URL已处理过，则跳过
                    if (removeDuplicates && url != null && !processedUrls.add(url)) {
                        continue;
                    }
                    
                    htmlContent.append("<tr>\n");
                    for (int col = 0; col < tableModel.getColumnCount(); col++) {
                        Object value = tableModel.getValueAt(row, col);
                        String cellValue = (value == null) ? "" : value.toString();

                        // 对于结果列，添加CSS类以显示颜色
                        if (col == 6 || col == 7) { // 低权限结果列和未授权结果列
                            String cssClass = getCssClassForCell(row, col, lowPrivilegeRenderers, unauthorizedRenderers);
                            htmlContent.append("<td class=\"").append(cssClass).append("\">").append(cellValue).append("</td>\n");
                        } else {
                            htmlContent.append("<td>").append(cellValue).append("</td>\n");
                        }
                    }
                    htmlContent.append("</tr>\n");
                }
                htmlContent.append("</tbody>\n");
                htmlContent.append("</table>\n");
            } else {
                htmlContent.append("<p>没有数据可显示。</p>\n");
            }

            htmlContent.append("</body>\n</html>");
            fileWriter.write(htmlContent.toString());
        }
    }

    /**
     * 判断是否应该包含某一行
     * @param tableModel 表格模型
     * @param row 行索引
     * @param filter 过滤条件
     * @return 是否应该包含该行
     */
    private static boolean shouldIncludeRow(TableModel tableModel, int row, String filter) {
        if ("全部".equals(filter)) {
            return true;
        }
        
        // 获取低权限结果和未授权结果列的值
        String lowPrivilegeResult = (String) tableModel.getValueAt(row, 6);  // 低权限结果列
        String unauthorizedResult = (String) tableModel.getValueAt(row, 7);  // 未授权结果列
        
        // 根据过滤条件判断是否应该包含该行
        return switch (filter) {
            case "被绕过" -> "被绕过".equals(lowPrivilegeResult) || "被绕过".equals(unauthorizedResult);
            case "待确认" -> "待确认".equals(lowPrivilegeResult) || "待确认".equals(unauthorizedResult);
            case "可防御" -> "可防御".equals(lowPrivilegeResult) || "可防御".equals(unauthorizedResult);
            default -> true;
        };
    }

    /**
     * 获取单元格的CSS类名（基于颜色）
     * @param row 行索引
     * @param col 列索引
     * @param lowPrivilegeRenderers 低权限渲染器列表
     * @param unauthorizedRenderers 未授权渲染器列表
     * @return CSS类名
     */
    private static String getCssClassForCell(
            int row,
            int col,
            List<ColorTableCellRenderer> lowPrivilegeRenderers,
            List<ColorTableCellRenderer> unauthorizedRenderers) {

        List<ColorTableCellRenderer> renderers = (col == 6) ? lowPrivilegeRenderers : unauthorizedRenderers;

        if (renderers != null && row < renderers.size()) {
            ColorTableCellRenderer renderer = renderers.get(row);
            if (renderer != null) {
                Color bgColor = renderer.getBackgroundColor();
                if (bgColor != null) {
                    // 根据背景色返回相应的CSS类
                    if (bgColor.getRGB() == new Color(0, 255, 0).getRGB()) {        // 绿色
                        return "defended";
                    } else if (bgColor.getRGB() == new Color(255, 0, 0).getRGB()) { // 红色
                        return "bypassed";
                    } else if (bgColor.getRGB() == new Color(255, 255, 0).getRGB()) { // 黄色
                        return "potentially-bypassed";
                    }
                }
            }
        }
        return ""; // 默认无样式
    }
}
